Skip to content

《C语言程序设计》期末试卷 (精选09)

一、判断题(每题 1 分,共 10 分)

要求: 正确打钩 ($\checkmark$),错误打叉 ($\times$)

  1. C 程序的执行从 main 函数开始,所以 main 函数必须放在程序最前面。

    查看答案与解析

    答案:$\times$

    解析: C 程序的执行确实是从 main 函数开始的,但 main 函数在源代码文件中的物理位置是随机的。它可以放在程序的开头、中间或末尾,不影响程序的入口定位。


    难度:考点: #main函数 #程序入口

    💡 学习锦囊

    📖 相关公式与知识点:

    • 一个 C 程序有且仅有一个 main 函数。
    • 编译系统通过名称定位入口点,而非行号或次序。

    思路分析

    区分"逻辑起点"与"物理位置"。执行从 main 开始是逻辑上的,而代码书写顺序是物理上的。

    🔄 举一反三
    1. 一个 C 语言程序可以有多个 main 函数吗?
      查看练习答案与解析

      答案:不可以。 解析main 函数是程序的唯一入口。如果定义多个,编译器会报"重定义"错误,因为系统无法确定从哪个函数开始执行。

  2. 任何变量都必须先定义其类型。

    查看答案与解析

    答案:$\checkmark$

    解析: C 语言是强类型语言(或静态类型语言)。在内存中为变量分配空间之前,编译器必须明确该变量的类型(如 int, float, char 等),以便确定分配的字节数和数据的编码方式。


    难度:考点: #变量定义 #强类型

    💡 学习锦囊

    📖 相关公式与知识点:

    • 变量定义的基本格式:类型 变量名;
    • 定义的作用:分配存储空间,指定运算规则。
    🔄 举一反三
    1. 变量可以在赋值的同时定义吗?例如 x = 5; 而不写 int x;
      查看练习答案与解析

      答案:不可以(在 C 语言中)。 解析:必须先声明类型,如 int x = 5;。直接赋值未定义的变量会导致"未声明的标识符"错误。

  3. 用格式符 %d 输出一个 float 类型变量时,会截断小数点部分,输出其整数部分。

    查看答案与解析

    答案:$\times$

    解析:%d 是整型格式符,它会按照整数的内存表示去解析数据。float 类型在内存中采用 IEEE 754 标准存储(包含符号位、阶码、尾数),与整数的补码存储完全不同。使用错误的格式符会导致解析出的数值完全错误,甚至输出 0,而不仅仅是截断小数。


    难度: ⭐⭐ 考点: #格式符 #数据类型 #内存表示

    💡 学习锦囊

    📖 相关公式与知识点:

    • 正确的格式符:float%fdouble%lfint%d
    • 类型不匹配的后果:未定义行为(UB),可能输出乱码或程序崩溃。
    🔄 举一反三
    1. %f 输出 int 变量会怎样?
      查看练习答案与解析

      答案:同样会出错。 解析%f 期望的是浮点数在内存中的表示(如 IEEE 754),而 int 是补码表示,两者不兼容。

  4. 在 C 语言中,a = b = 1; 是合法的赋值语句。

    查看答案与解析

    答案:$\checkmark$

    解析: 赋值运算符 =右结合的,且表达式本身有值(即赋值后左侧变量的值)。因此 a = b = 1; 等价于 a = (b = 1);,先执行 b = 1(返回 1),再执行 a = 1


    难度:考点: #赋值运算符 #结合性

    💡 学习锦囊

    📖 相关公式与知识点:

    • 赋值表达式:变量 = 表达式 的值等于赋值后变量的值。
    • 结合性:= 是右结合,+-*/ 是左结合。
    🔄 举一反三
    1. a = b = c = 0; 的执行顺序是什么?
      查看练习答案与解析

      答案:从右向左。 解析a = (b = (c = 0)),先 c = 0,再 b = 0,最后 a = 0

  5. 在 C 语言中,int a[10]; 定义了一个包含 10 个整数的数组,其下标范围是 1 到 10。

    查看答案与解析

    答案:$\times$

    解析: C 语言的数组下标从 0 开始int a[10]; 定义了 10 个元素:a[0], a[1], ..., a[9]。访问 a[10] 是越界行为(未定义行为)。


    难度:考点: #数组下标 #越界访问

    💡 学习锦囊

    📖 相关公式与知识点:

    • 数组长度:sizeof(a) / sizeof(a[0])
    • 常见错误:循环中 for(i=1; i<=10; i++) 访问 a[i] 会导致越界。
    🔄 举一反三
    1. 如何正确定义并遍历一个长度为 5 的数组?
      查看练习答案与解析

      答案

      c
      int arr[5];
      for(int i=0; i<5; i++) {
          // 使用 arr[i]
      }
  6. break 语句只能用于 switch 语句中。

    查看答案与解析

    答案:$\times$

    解析:break 语句可以用于:

    • switch 语句:跳出当前 case
    • 循环(for/while/do-while):立即终止循环 但不能用于跳出 if 语句或函数。

    难度:考点: #break语句 #流程控制

    💡 学习锦囊

    📖 相关公式与知识点:

    • break vs continuebreak 终止整个循环,continue 跳过本次循环剩余部分。
    • goto:可以跳转到任意标签,但一般不推荐使用。
    🔄 举一反三
    1. 在嵌套循环中,内层循环的 break 会影响外层循环吗?
      查看练习答案与解析

      答案:不会。 解析break 只跳出最近的一层循环。要跳出多层循环需要使用标志变量或 goto

  7. 函数可以嵌套定义,即在一个函数内部定义另一个函数。

    查看答案与解析

    答案:$\times$

    解析: C 语言不支持函数嵌套定义。所有函数必须在全局作用域中定义(即不能在一个函数内部定义另一个函数)。但可以嵌套调用


    难度:考点: #函数定义 #作用域

    💡 学习锦囊

    📖 相关公式与知识点:

    • 函数声明:返回值类型 函数名(参数列表);
    • 函数定义:包含函数体 { ... }
    • C++ 支持 lambda 表达式(匿名函数),但 C 不支持。
    🔄 举一反三
    1. 如何在函数内部使用另一个函数?
      查看练习答案与解析

      答案:先声明(或定义)该函数,然后在函数内部调用。 示例

      c
      void helper() { /* ... */ }
      void main() { helper(); }  // 正确:调用已定义的函数
  8. 宏定义 #define PI 3.14159 会在编译时进行类型检查。

    查看答案与解析

    答案:$\times$

    解析: 宏是预处理指令,在编译前进行简单的文本替换,没有类型检查PI 会被直接替换为 3.14159,不管上下文是否类型匹配。


    难度: ⭐⭐ 考点: #宏定义 #预处理 #类型安全

    💡 学习锦囊

    📖 相关公式与知识点:

    • 宏 vs const:const double PI = 3.14159; 有类型检查,更安全。
    • 带参数宏:#define MAX(a,b) ((a)>(b)?(a):(b))
    🔄 举一反三
    1. 为什么带参数的宏需要给每个参数加括号?
      查看练习答案与解析

      答案:避免运算符优先级问题。 示例MAX(a+b, c*d) 如果不加括号会变成 a+b > c*d ? a+b : c*d,可能不符合预期。

  9. 在 C 语言中,字符串是以字符 '\0' 结尾的字符数组。

    查看答案与解析

    答案:$\checkmark$

    解析: 这是 C 语言字符串的核心特征。'\0'(ASCII 值为 0)作为字符串的结束标志,使得字符串处理函数(如 strlen, strcpy)知道在哪里停止。


    难度:考点: #字符串 #结束符

    💡 学习锦囊

    📖 相关公式与知识点:

    • 字符串字面量:"hello" 自动包含 '\0'
    • 字符数组初始化:char s[6] = "hello";char s[] = "hello";
    🔄 举一反三
    1. char s[5] = "hello"; 是否正确?
      查看练习答案与解析

      答案:错误。 解析"hello" 有 5 个字符,但需要 6 个字节的空间(包含 '\0')。应该定义为 char s[6] = "hello";

  10. 文件操作完成后必须调用 fclose 函数关闭文件。

    查看答案与解析

    答案:$\checkmark$

    解析: 关闭文件的重要性:

    • 释放资源:文件描述符是有限的系统资源
    • 确保写入:缓冲区中的数据可能还未真正写入磁盘
    • 避免数据损坏:异常退出时未关闭的文件可能丢失数据

    难度:考点: #文件操作 #资源管理

    💡 学习锦囊

    📖 相关公式与知识点:

    • 文件操作三部曲:fopen → 读写操作 → fclose
    • 错误处理:检查 fopen 返回值是否为 NULL
    🔄 举一反三
    1. 如果不调用 fclose 会怎样?
      查看练习答案与解析

      答案:程序正常退出时系统会自动关闭,但:

      • 可能丢失缓冲区中的数据
      • 长期运行的程序会耗尽文件描述符
      • 不是好的编程习惯

二、单项选择题(每题 2 分,共 20 分)

  1. 以下合法的 C 语言标识符是 ( )。

    • A. 3abc
    • B. _name
    • C. int
    • D. a-b
    查看答案与解析

    答案:B

    解析:

    • A:不能以数字开头
    • B:正确,以下划线开头是合法的
    • C:int 是关键字,不能作为标识符
    • D:不能包含减号(-

    难度:考点: #标识符规则

    💡 学习锦囊

    📖 相关公式与知识点:

    • 标识符规则:字母/下划线开头,后跟字母/数字/下划线
    • 关键字:int, float, if, for 等保留字不能用作标识符
    🔄 举一反三
    1. 以下哪个是合法的标识符?
      • A. 2var
      • B. var-name
      • C. var_name
      • D. float
      查看练习答案与解析

      答案:C

  2. 表达式 (int)3.6 * 3 的值是 ( )。

    • A. 10.8
    • B. 9
    • C. 10
    • D. 编译错误
    查看答案与解析

    答案:B

    解析:

    1. (int)3.6 进行强制类型转换,结果为 3(截断小数部分)
    2. 3 * 3 = 9 注意:类型转换优先级高于乘法。

    难度: ⭐⭐ 考点: #类型转换 #运算符优先级

    💡 学习锦囊

    📖 相关公式与知识点:

    • 强制类型转换:(类型)表达式
    • 浮点转整型:直接截断小数部分(不是四舍五入)
    🔄 举一反三
    1. (int)(3.6 * 3) 的结果是多少?
      查看练习答案与解析

      答案:10解析:先计算 3.6 * 3 = 10.8,再转换为 int 得到 10。

  3. 设有定义 int a=3, b=4, c=5;,则表达式 !(a+b)+c-1 && b+c/2 的值是 ( )。

    • A. 6
    • B. 0
    • C. 2
    • D. 1
    查看答案与解析

    答案:D

    解析: 按运算符优先级计算:

    1. a+b=7!(7)=0(逻辑非:非0变0,0变1)
    2. 0+c-1=0+5-1=4
    3. b+c/2=4+5/2=4+2=6(整数除法)
    4. 4 && 6 → 真(非0),结果为 1

    难度: ⭐⭐⭐ 考点: #逻辑运算 #运算符优先级

    💡 学习锦囊

    📖 相关公式与知识点:

    • 优先级:() > ! > */% > +- > && > ||
    • 逻辑运算结果:真为 1,假为 0
    🔄 举一反三
    1. !0 && 2 || 0 的结果是多少?
      查看练习答案与解析

      答案:1解析!0=11&&2=11||0=1

  4. 以下程序的输出结果是 ( )。

    c
    #include <stdio.h>
    void main()
    {
        int i, sum=0;
        for(i=1; i<=3; sum+=i, i++);
        printf("%d", sum);
    }
    • A. 6
    • B. 3
    • C. 死循环
    • D. 0
    查看答案与解析

    答案:A

    解析:

    • 注意 for 循环语句以分号结束,循环体为空
    • 执行过程:
      • i=1: sum=0+1=1, i=2
      • i=2: sum=1+2=3, i=3
      • i=3: sum=3+3=6, i=4
      • i=4>3,循环结束
    • 输出:6

    难度: ⭐⭐ 考点: #for循环 #逗号运算符

    💡 学习锦囊

    📖 相关公式与知识点:

    • 逗号运算符:按顺序执行,整个表达式的值为最后一个表达式的值
    • 空语句:单独的分号 ; 是一个空语句
    🔄 举一反三
    1. 以下代码输出什么?
      c
      int x = (1, 2, 3);
      printf("%d", x);
      查看练习答案与解析

      答案:3

  5. 以下关于数组初始化的语句中,正确的是 ( )。

    • A. int a[3] = {1, 2, 3, 4};
    • B. int a[] = {1, 2, 3};
    • C. int a[3] = {};
    • D. int a[];
    查看答案与解析

    答案:B

    解析:

    • A:初始值个数超过数组长度
    • B:正确,编译器自动推断长度为 3
    • C:C99 之前不支持空初始化列表
    • D:必须指定长度或提供初始值

    难度:考点: #数组初始化

    💡 学习锦囊

    📖 相关公式与知识点:

    • 部分初始化:int a[5] = {1,2}; 后三个元素为 0
    • 指定初始化:int a[5] = {[2]=3, [4]=5};(C99)
    🔄 举一反三
    1. int a[] = {1}; 的数组长度是多少?
      查看练习答案与解析

      答案:1

  6. 以下程序的输出结果是 ( )。

    c
    #include <stdio.h>
    void main()
    {
        int a=2, b=-1, c=2;
        if(a < b)
            if(b < 0) c=0;
        else c++;
        printf("%d", c);
    }
    • A. 0
    • B. 1
    • C. 2
    • D. 3
    查看答案与解析

    答案:C

    解析:

    • 注意 else 与最近的未匹配的 if 配对(就近匹配原则)
    • 实际结构:
      c
      if(a < b) {          // 2<-1 为假,跳过整个块
          if(b < 0) c=0;
          else c++;        // else 与 if(b<0) 配对
      }
    • 由于 a < b(2 < -1)为假,整个 if 块被跳过,c 保持原值 2
    • 缩进虽然暗示 else 与外层 if 配对,但 C 语言编译器只遵循就近匹配原则
    • 输出:2

    难度: ⭐⭐ 考点: #if-else匹配 #缩进误导

    💡 学习锦囊

    📖 相关公式与知识点:

    • else 匹配原则:与最近的未匹配的 if 匹配
    • 使用大括号避免歧义

    易错点

    缩进不能改变 else 的匹配规则!else 始终与最近的未匹配 if 配对,无论缩进如何。为避免歧义,建议始终使用大括号。

    🔄 举一反三
    1. 以下代码输出什么?
      c
      int x=1, y=2;
      if(x>y) if(y>0) x=3; else x=4;
      printf("%d", x);
      查看练习答案与解析

      答案:1解析:else 与最近的 if(y>0) 配对。外层 if(x>y) 为假(1>2),跳过整个 if-else 结构,x 保持 1。

  7. 以下关于函数的说法中,正确的是 ( )。

    • A. 实参和形参占用相同的内存单元
    • B. 形参可以是常量
    • C. 函数的返回值类型不能是 void
    • D. 函数可以没有参数
    查看答案与解析

    答案:D

    解析:

    • A:错误,实参和形参是不同的变量,占用不同内存
    • B:错误,形参必须是变量
    • C:错误,void 表示函数不返回值
    • D:正确,如 void func(void)

    难度:考点: #函数参数 #返回值

    💡 学习锦囊

    📖 相关公式与知识点:

    • 参数传递:值传递(拷贝)、地址传递(指针)
    • 无参函数:void func(void)void func()
    🔄 举一反三
    1. 以下函数声明哪个是正确的?
      • A. int func(int a, b);
      • B. void func(int);
      • C. func(void) int;
      • D. int func(3);
      查看练习答案与解析

      答案:B

  8. 设有定义 char s[]="abc";,则 sizeof(s)strlen(s) 的值分别是 ( )。

    • A. 3, 3
    • B. 4, 3
    • C. 3, 4
    • D. 4, 4
    查看答案与解析

    答案:B

    解析:

    • sizeof(s):数组总字节数,"abc" 包含 'a','b','c','\0' 共 4 个字符
    • strlen(s):字符串长度(不包含 '\0'),结果为 3

    难度: ⭐⭐ 考点: #sizeof #strlen #字符串存储

    💡 学习锦囊

    📖 相关公式与知识点:

    • sizeof:编译时确定,返回类型或对象的大小
    • strlen:运行时计算,遍历直到 '\0'
    🔄 举一反三
    1. char s[10]="hello";sizeof(s)strlen(s) 分别是多少?
      查看练习答案与解析

      答案:10, 5

  9. 以下程序的输出结果是 ( )。

    c
    #include <stdio.h>
    void main()
    {
        int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
        int i, sum=0;
        for(i=0; i<3; i++)
            sum += a[i][2-i];
        printf("%d", sum);
    }
    • A. 15
    • B. 10
    • C. 9
    • D. 不确定
    查看答案与解析

    答案:A

    解析: 访问的元素:

    • i=0: a[0][2] = 3
    • i=1: a[1][1] = 5
    • i=2: a[2][0] = 7
    • sum = 3+5+7 = 15

    难度: ⭐⭐ 考点: #二维数组 #对角线访问

    💡 学习锦囊

    📖 相关公式与知识点:

    • 二维数组内存布局:按行存储
    • 主对角线:a[i][i],副对角线:a[i][n-1-i]
    🔄 举一反三
    1. 如何求 3×3 矩阵主对角线元素之和?
      查看练习答案与解析

      答案

      c
      for(i=0; i<3; i++)
          sum += a[i][i];
  10. 以"只写"方式打开文本文件 d:\tmp.txt,下列语句中正确的是 ( )。

    • A. fp=fopen("d:\tmp.txt", "r");
    • B. fp=fopen("d:\tmp.txt", "w");
    • C. fp=fopen("d:\tmp.txt", "wb");
    • D. fp=fopen("d:\tmp.txt", "a");
    查看答案与解析

    答案:B

    解析:

    • "r":只读
    • "w":只写(文本模式)✓
    • "wb":只写(二进制模式)
    • 题目要求"只写"和"文本文件",故选 "w"

    难度:考点: #文件打开模式 #fopen

    💡 学习锦囊

    📖 相关公式与知识点:

    • 文本 vs 二进制:文本模式带 b 字后缀
    🔄 举一反三
    1. 模式 "a+" 的含义是什么?
      查看练习答案与解析

      答案:以读/写方式打开文件进行追加

三、程序阅读题(每题 5 分,共 25 分)

1. while 与 do-while 循环对比

c
#include <stdio.h>
void main()
{
    int i=10, s=0;
    while(i>10) {
        s+=i;
        i--;
    }
    printf("while: s=%d\n",s);
    
    i=10; s=0;
    do {
        s+=i;
        i--;
    } while(i>10);
    printf("do-while: s=%d\n",s);
}
查看答案与解析

输出结果:

while: s=0
do-while: s=10

解析:

  • while 循环:先判断条件 i>10(10>10 为假),循环体一次都不执行
  • do-while 循环:先执行一次循环体(s=0+10=10, i=9),再判断条件 i>10(9>10 为假)

关键差异:

  • while:先判断后执行(可能执行 0 次)
  • do-while:先执行后判断(至少执行 1 次)

难度:考点: #while循环 #do-while循环 #循环条件

💡 学习锦囊

📖 相关公式与知识点:

  • 循环选择:
    • 已知循环次数 → for
    • 条件控制,可能不执行 → while
    • 条件控制,至少执行一次 → do-while
🔄 举一反三
  1. 将条件改为 i>=10,输出结果会怎样变化?
    查看练习答案与解析

    答案:两个循环都会变成无限循环 解析:初始 i=10,条件 i>=10 永远为真。

2. 静态变量与自动变量

c
#include <stdio.h>
int func(int x)
{
    static int y = 0;
    int s = x + y;
    y++;
    return s;
}
void main()
{
    printf("%d,", func(0));
    printf("%d,", func(1));
    printf("%d", func(2));
}
查看答案与解析

输出结果:

0,2,4

解析:

  • static int y = 0;:静态变量,只初始化一次,函数调用间保持值
  • 执行过程:
    1. func(0):y=0, s=0+0=0, y=1 → 返回 0
    2. func(1):y=1, s=1+1=2, y=2 → 返回 2
    3. func(2):y=2, s=2+2=4, y=3 → 返回 4

难度: ⭐⭐ 考点: #static变量 #变量生命周期

💡 学习锦囊

📖 相关公式与知识点:

  • 自动变量:每次调用重新初始化
  • 静态变量:只初始化一次,程序运行期间保持
  • 常见错误:
    • 忘记 static 变量在函数退出后值不丢失
    • 忽略 y++ 是先用后增,返回值时 y 还没增,但下次调用时 y 已增
🔄 举一反三
  1. 再次调用 func(0),在 static 模式下结果是多少?
    查看练习答案与解析

    答案:3 解析:上次调用后 y 变成了 3。再次调用 func(0) 时,y 保持 3,$s = 0 + 3 = 3$,然后 y 自增为 4。

四、程序填空题(每空 2 分,共 20 分)

1. 求阶乘和

程序功能: 从键盘输入 n,求表达式 $1!+2!+3!+\dots+n!$ 的和。

c
#include <stdio.h>
void main()
{
    int i,n;
    double s=1,k=1;
    scanf("%d",&n);
    for(i=2;i<=n;i++){
        _____(1)_____;
        _____(2)_____;
    }
    printf("%.0f",s);
}
查看答案与解析

答案: (1) k *= i; (或 k = k * i;) (2) s += k; (或 s = s + k;)

解析: 这是一个累加求和算法,其中每一项又是阶乘(累乘)。

  1. (1) 处:变量 k 用于存储当前的阶乘值。当 $i=2$ 时,我们需要计算 $2!$,即 $1! \times 2$。所以 k = k * i
  2. (2) 处:变量 s 用于存储总和。计算出当前项 k 后,需要累加进 s。所以 s = s + k

难度: ⭐⭐ 考点: #累加累乘 #阶乘算法

💡 学习锦囊

📖 相关公式与知识点:

  • 递推关系:$n! = (n-1)! \times n$
  • 循环初始化:注意 $s$$k$ 的初始值(本题均已初始化为 1,对应 $1!$)
🔄 举一反三
  1. 如果要计算 $\sum_{i=1}^n \frac{1}{i!}$,(2) 处应该改为什么?
    查看练习答案与解析

    答案s += 1.0/k;

2. 求最大素数之和

程序功能: 计算并输出 num 以内最大的 10 个素数之和,num 由主函数传给 fun 函数。如 num 为 100,则结果为 732;如 num 为 10,则结果为 $7+5+3+2=17$

c
#include <stdio.h>  
int fun( int num)  
{  
    int sum=0, n=0, j, flag;  
    while ((num>= 2) && ( __ (3) __ ))  
    {  
        flag = 1;  
        for (j=2; j<=num/2; j++)  
        {  
            if ( __ (4) __ )  
            {  
                flag =0;  
                break;  
            }  
        }  
        if(flag)  
        {  
            sum +=num;  
            n++;  
        }  
        num--;  
    }  
    __ (5) __;  
}  
void main ( )  
{  
    int num;  
    scanf("%d",&num);  
    printf("%d\n", fun(num));  
}
查看答案与解析

答案: (3) n < 10 (4) num % j == 0 (5) return sum;

解析:

  1. (3) 处:题目要求找最大的 10 个素数。变量 n 记录已找到的素数个数。当 $n < 10$ 时继续寻找。
  2. (4) 处:素数判定逻辑。如果 num 能被 j 整除,则不是素数。条件为 num % j == 0
  3. (5) 处:函数需要返回计算出的总和 sum

难度: ⭐⭐⭐ 考点: #素数判定 #循环控制 #函数返回值

💡 学习锦囊

📖 相关公式与知识点:

  • 素数定义:只能被 1 和自身整除的自然数
  • 判定优化:通常判断到 $\sqrt{num}$ 即可,本题使用了 $num/2$ 也是正确的
🔄 举一反三
  1. 若要判断一个数是否为偶数,(4) 处的表达式如何修改?
    查看练习答案与解析

    答案num % 2 == 0

3. 杨辉三角形

程序功能: 输出以下形式的杨辉三角形。

  1
  1  1
  1  2  1
  1  3  3  1
  1  4  6  4  1
  1  5 10 10  5  1
  1  6 15 20 15  6  1
c
#include <stdio.h>  
#define N 7  
void yanghui(__ (6) __ )  
{  
    int i,j;  
    for (i=0;i<N;i++) {  
        a[i][0]=1;  
        a[i][i]=1;  
    }  
    for (i=2;i<N;i++)  
        for (j=1; __ (7) __ ;j++)  
            a[i][j]= a[i-1][j-1]+ __ (8) __ ;  
}  
void main()  
{  
    int x[N][N],i,j;  
    yanghui(x);  
    for (i=0;i<N;i++){  
        for (j=0;j<=i;j++)  
            printf("%3d",x[i][j]);  
        printf("\n");  
    }  
}
查看答案与解析

答案: (6) int a[][N] (或 int a[N][N]) (7) j < i (8) a[i-1][j]

解析:

  1. (6) 处:形参接收二维数组。C 语言规定,二维数组作形参时,第二维长度必须固定
  2. (7) 处:杨辉三角每行的中间部分计算。对于第 i 行,其索引范围是 $0 \sim i$。两端(0 和 i)已赋值为 1,中间部分 $1 \sim i-1$ 需要计算。故 j < i
  3. (8) 处:核心公式。每个数等于它上方两数之和:$a[i][j] = a[i-1][j-1] + a[i-1][j]$

难度: ⭐⭐⭐ 考点: #二维数组传参 #递推算法 #杨辉三角

💡 学习锦囊

📖 相关公式与知识点:

  • 杨辉三角性质:第 $n$ 行第 $m$ 个数是组合数 $C_{n-1}^{m-1}$
🔄 举一反三
  1. 若要输出杨辉三角的第 10 行,N 应定义为多少?
    查看练习答案与解析

    答案:10

4. 寻找最大字符串

程序功能: 输入 5 个字符串,输出其中字典序最大的字符串。

c
#include<stdio.h>  
#include<string.h>  
void main()  
{  
    char s[80],max[80];  
    int i;
    scanf("%s",max);
    for(i=1;i<=4;i++){
        scanf("%s",s);
        if(__(9)__)
            __(10)__;
    }
    printf("最大字符串是: %s\n",max);
}
查看答案与解析

答案: (9) strcmp(s, max) > 0 (10) strcpy(max, s);

解析:

  1. (9) 处:字符串比较不能直接使用 >,必须使用库函数 strcmp。返回正值表示前者大于后者。
  2. (10) 处:找到更大的字符串后,需要将其内容更新到 max 中。字符数组赋值必须使用 strcpy

难度: ⭐⭐ 考点: #字符串函数 #strcmp #strcpy

💡 学习锦囊

📖 相关公式与知识点:

  • strcmp(s1, s2):s1=s2 返回 0,s1>s2 返回正值,s1<s2 返回负值
  • strcpy(dest, src):将 src 拷贝到 dest
🔄 举一反三
  1. 若要输出最短的字符串,(9) 处应如何修改?(假设已包含 strlen
    查看练习答案与解析

    答案strlen(s) < strlen(max)

五、程序设计题(每题 10 分,共 30 分)

1. 数字逆序输出

题目: 编写程序,输入一个正整数,将其各位数字逆序输出。例如输入 12345,输出 54321。

查看答案与解析

【参考代码】

c
#include <stdio.h>

void main()
{
    int num, digit;
    
    printf("请输入一个正整数: ");
    scanf("%d", &num);
    
    printf("逆序输出: ");
    
    while(num > 0) {
        digit = num % 10;     // 取最后一位
        printf("%d", digit);  // 输出该位
        num = num / 10;       // 去掉最后一位
    }
    
    printf("\n");
}

难度: ⭐⭐ 考点: #取模运算 #整数分解 #循环控制

💡 学习锦囊

📖 相关公式与知识点:

  • 取个位:num % 10
  • 去掉个位:num / 10
  • 循环条件:num > 0(处理完所有位)
🔄 举一反三
  1. 如何将逆序后的数字存储为一个新的整数(如 12345 → 54321)?
    查看练习答案与解析

    解析

    c
    int reverse = 0;
    while(num > 0) {
        reverse = reverse * 10 + num % 10;
        num /= 10;
    }

2. 密码强度验证

题目: 编写函数 checkPassword,验证密码是否包含至少一个字母和一个数字。返回 1 表示符合要求,0 表示不符合。

查看答案与解析

【参考代码】

c
#include <stdio.h>
#include <ctype.h>

int checkPassword(char s[])
{
    int hasLetter = 0, hasDigit = 0;
    int i;
    
    for(i=0; s[i]!='\0'; i++) {
        if(isalpha(s[i])) hasLetter = 1;
        if(isdigit(s[i])) hasDigit = 1;
    }
    
    return hasLetter && hasDigit;
}

void main()
{
    char password[100];
    
    printf("请输入密码: ");
    scanf("%s", password);
    
    if(checkPassword(password)) {
        printf("密码强度符合要求\n");
    } else {
        printf("密码必须包含字母和数字\n");
    }
}

难度: ⭐⭐ 考点: #字符串遍历 #标志变量 #ctype宏

💡 学习锦囊

📖 相关公式与知识点:

  • 标志位(Flag):利用 hasLetterhasDigit 记录是否出现过目标字符
  • ctype.h:推荐使用 isalpha()isdigit() 使代码更简洁
🔄 举一反三
  1. 增加要求:密码长度必须大于 6 位。应在函数中如何补充?
    查看练习答案与解析

    解析: 利用 strlen(s) > 6 进行判断。 修改后

    c
    return hasLetter && hasDigit && (strlen(s) > 6);

3. 时间结构体运算

题目: 利用结构体编写程序,输入某一时刻的时间(时:分:秒),计算加一秒后的时间,并以 hh:mm:ss 格式输出。

查看答案与解析

【参考代码】

c
#include <stdio.h>

struct Time
{
    int hour;
    int minute;
    int second;
};

void addOneSecond(struct Time *t)
{
    t->second++;           // 秒加1
    
    if(t->second >= 60) {  // 秒满60进分
        t->second = 0;
        t->minute++;
        
        if(t->minute >= 60) {  // 分满60进时
            t->minute = 0;
            t->hour++;
            
            if(t->hour >= 24) {  // 时满24归零
                t->hour = 0;
            }
        }
    }
}

void main()
{
    struct Time now;
    
    printf("请输入当前时间(时 分 秒): ");
    scanf("%d %d %d", &now.hour, &now.minute, &now.second);
    
    addOneSecond(&now);
    
    printf("加一秒后的时间: %02d:%02d:%02d\n", now.hour, now.minute, now.second);
}

难度: ⭐⭐ 考点: #结构体 #进位逻辑 #结构体指针

💡 学习锦囊

📖 相关公式与知识点:

  • 进位思想:秒满 60 进分,分满 60 进时,时满 24 清零
  • 输出格式:%02d 表示输出宽度为 2,不足 2 位前方补 0

思路分析

这类题目的核心是正确处理三级嵌套的 if 进位。不要忘记小时满 24 后应回退到 0。

🔄 举一反三
  1. 如果要"减一秒",核心逻辑应如何改动?
    查看练习答案与解析

    解析

    c
    t->second--;
    if(t->second < 0) {
        t->second = 59;
        t->minute--;
        // ... 依此类推处理分和时
    }
你正在阅读的是会员专属文档,💕 限时特惠进行中
你尚未登录,目前新用户可获3天体验会员,去登录